๊ฐ ํ์ ๋ถํฐ JIT ์ปดํ์ผ๊น์ง ๊ณ ๊ธ ํ์ ์ต์ ํ ๊ธฐ์ ์ ํ๊ตฌํ์ฌ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํํธ์จ์ด ์ฑ๋ฅ๊ณผ ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํค์ธ์. ์๋๋ฅผ ๊ทน๋ํํ๊ณ ๋ฆฌ์์ค ์๋น๋ฅผ ์ค์ ๋๋ค.
๊ณ ๊ธ ํ์ ์ต์ ํ: ๊ธ๋ก๋ฒ ์ํคํ ์ฒ ์ ๋ฐ์ ๊ฑธ์น ์ต๊ณ ์ ์ฑ๋ฅ ๋ฐํ
๊ฑฐ๋ํ๊ณ ๋์์์ด ์งํํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฑ๋ฅ์ ์ฌ์ ํ ๊ฐ์ฅ ์ค์ํ ๊ด์ฌ์ฌ์ ๋๋ค. ๊ณ ๋น๋ ๊ฑฐ๋ ์์คํ ๋ถํฐ ํ์ฅ ๊ฐ๋ฅํ ํด๋ผ์ฐ๋ ์๋น์ค ๋ฐ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ์ฃ์ง ๋๋ฐ์ด์ค์ ์ด๋ฅด๊ธฐ๊น์ง, ๊ธฐ๋ฅ์ ์ผ ๋ฟ๋ง ์๋๋ผ ์์ธ์ ์ผ๋ก ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์์๋ ์ ์ธ๊ณ์ ์ผ๋ก ๊ณ์ ์ฆ๊ฐํ๊ณ ์์ต๋๋ค. ์๊ณ ๋ฆฌ์ฆ ๊ฐ์ ๊ณผ ์ํคํ ์ฒ ๊ฒฐ์ ์ด ์ข ์ข ์ฃผ๋ชฉ์ ๋ฐ์ง๋ง, ๋ ๊น๊ณ ์ธ๋ถํ๋ ์์ค์ ์ต์ ํ๋ ์ฐ๋ฆฌ ์ฝ๋์ ๊ทผ๊ฐ์ธ ๊ณ ๊ธ ํ์ ์ต์ ํ์ ์์ต๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ํ์ ์์คํ ์ ๋ํ ์ ํํ ์ดํด๋ฅผ ํ์ฉํ์ฌ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ด๋ฃจ๊ณ , ๋ฆฌ์์ค ์๋น๋ฅผ ์ค์ด๋ฉฐ, ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ๊ฒฝ์๋ ฅ ์๋ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ์ ๊ตํ ๊ธฐ์ ์ ํ๊ตฌํฉ๋๋ค.
์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์๊ฒ ์ด๋ฌํ ๊ณ ๊ธ ์ ๋ต์ ์ดํดํ๊ณ ์ ์ฉํ๋ ๊ฒ์ ๋จ์ง ๊ธฐ๋ฅํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ ๋ฐ ๋ค์ํ ํ๋์จ์ด์ ์ํํธ์จ์ด ์ํ๊ณ ์ ๋ฐ์ ๊ฑธ์ณ ์ด์ ๋น์ฉ ์ ๊ฐ์ ์ ๊ณตํ๋ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ์๋ฏธํ ์ ์์ต๋๋ค.
ํ์ ์์คํ ์ ๊ธฐ์ด ์ดํด: ๊ธ๋ก๋ฒ ๊ด์
๊ณ ๊ธ ๊ธฐ์ ์ ์ดํด๋ณด๊ธฐ ์ ์ ํ์ ์์คํ ๊ณผ ๊ทธ ๊ณ ์ ํ ์ฑ๋ฅ ํน์ฑ์ ๋ํ ์ดํด๋ฅผ ํ๊ณ ํ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์ํ ์ง์ญ๊ณผ ์ฐ์ ์์ ์ธ๊ธฐ ์๋ ์ฌ๋ฌ ์ธ์ด๋ ํ์ดํ์ ๋ํด ๊ฐ๊ธฐ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ฉฐ, ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ต๋๋ค.
์ ์ ํ์ดํ vs. ๋์ ํ์ดํ ์ฌ๊ณ ์ฐฐ: ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ
์ ์ ํ์ดํ๊ณผ ๋์ ํ์ดํ ๊ฐ์ ์ด๋ถ๋ฒ์ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ ์ ํ์ ์ธ์ด(์: C++, Java, C#, Rust, Go)๋ ์ปดํ์ผ ์๊ฐ์ ํ์ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค. ์ด ์ด๊ธฐ ๊ฒ์ฆ์ ํตํด ์ปดํ์ผ๋ฌ๋ ๊ณ ๋๋ก ์ต์ ํ๋ ๊ธฐ๊ณ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋์ ํ์ ํ๊ฒฝ์์๋ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ ํํ์ ์ฐ์ฐ์ ๋ํ ๊ฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ฐํ์ ํ์ ๊ฒ์ฌ์ ์ค๋ฒํค๋๊ฐ ์ ๊ฑฐ๋๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ด ๋ ์์ธก ๊ฐ๋ฅํด์ ธ ์บ์ ํ์ฉ๋๊ฐ ํฅ์๋ฉ๋๋ค.
๋ฐ๋๋ก, ๋์ ํ์ ์ธ์ด(์: Python, JavaScript, Ruby)๋ ๋ฐํ์๊น์ง ํ์ ๊ฒ์ฌ๋ฅผ ๋ฏธ๋ฃน๋๋ค. ์ด๋ ๋ ํฐ ์ ์ฐ์ฑ๊ณผ ๋น ๋ฅธ ์ด๊ธฐ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ์ ๊ณตํ์ง๋ง, ์ข ์ข ์ฑ๋ฅ ๋น์ฉ์ ์๋ฐํฉ๋๋ค. ๋ฐํ์ ํ์ ์ถ๋ก , ๋ฐ์ฑ/์ธ๋ฐ์ฑ, ๋คํ์ ๋์คํจ์น๋ ํนํ ์ฑ๋ฅ์ด ์ค์ํ ์น์ ์์ ์คํ ์๋์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์๋ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํฉ๋๋ค. ์ต์ JIT ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฌํ ๋น์ฉ์ ์ผ๋ถ๋ฅผ ์ํํ์ง๋ง, ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ ์ฌ์ ํ ๋จ์ ์์ต๋๋ค.
์ถ์ํ์ ๋คํ์ฑ์ ๋น์ฉ
์ถ์ํ๋ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ํํธ์จ์ด์ ์ด์์ ๋๋ค. ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ ๋คํ์ฑ์ ํฌ๊ฒ ์์กดํ์ฌ, ๋ค๋ฅธ ํ์ ์ ๊ฐ์ฒด๋ค์ด ๊ณตํต ์ธํฐํ์ด์ค๋ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ํตํด ๊ท ์ผํ๊ฒ ์ฒ๋ฆฌ๋ ์ ์๋๋ก ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๊ฐ๋ ฅํจ์ ์ข ์ข ์ฑ๋ฅ ์ ํ๋ฅผ ๋๋ฐํฉ๋๋ค. ๊ฐ์ ํจ์ ํธ์ถ(vtable ์กฐํ), ์ธํฐํ์ด์ค ๋์คํจ์น, ๋์ ๋ฉ์๋ ํ์ธ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ ๋ฐํ๊ณ ์ปดํ์ผ๋ฌ์ ๊ณต๊ฒฉ์ ์ธ ์ธ๋ผ์ด๋์ ๋ฐฉํดํฉ๋๋ค.
์ ์ธ๊ณ์ ์ผ๋ก C++, Java ๋๋ C#์ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ค์ ์ข ์ข ์ด ์ ์ถฉ์๊ณผ ์จ๋ฆํฉ๋๋ค. ๋์์ธ ํจํด๊ณผ ํ์ฅ์ฑ์ ํ์์ ์ด์ง๋ง, ํซ ์ฝ๋ ๊ฒฝ๋ก์์ ๋ฐํ์ ๋คํ์ฑ์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๊ณ ๊ธ ํ์ ์ต์ ํ๋ ์ข ์ข ์ด๋ฌํ ๋น์ฉ์ ์ค์ด๊ฑฐ๋ ์ต์ ํํ๋ ์ ๋ต์ ํฌํจํฉ๋๋ค.
ํต์ฌ ๊ณ ๊ธ ํ์ ์ต์ ํ ๊ธฐ๋ฒ
์ด์ ์ฑ๋ฅ ํฅ์์ ์ํด ํ์ ์์คํ ์ ํ์ฉํ๋ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฒ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐ ํ์ ๋ฐ ๊ตฌ์กฐ์ฒด ํ์ฉ
๊ฐ์ฅ ์ํฅ๋ ฅ ์๋ ํ์ ์ต์ ํ ์ค ํ๋๋ ์ฐธ์กฐ ํ์ (ํด๋์ค) ๋์ ๊ฐ ํ์ (๊ตฌ์กฐ์ฒด)์ ์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฒด๊ฐ ์ฐธ์กฐ ํ์ ์ผ ๋, ๊ทธ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก ํ์ ํ ๋น๋๊ณ ๋ณ์๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ฐธ์กฐ(ํฌ์ธํฐ)๋ฅผ ๋ณด์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ฐ ํ์ ์ ์ ์ธ๋ ์์น์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉฐ, ์ข ์ข ์คํ์ด๋ ๋ค๋ฅธ ๊ฐ์ฒด ๋ด๋ถ์ ์ธ๋ผ์ธ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
- ํ ํ ๋น ๊ฐ์: ํ ํ ๋น์ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ์ด๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ฒ์ํ๊ณ , ๋ด๋ถ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์
๋ฐ์ดํธํ๋ฉฐ, ์ ์ฌ์ ์ผ๋ก ๊ฐ๋น์ง ์ปฌ๋ ์
์ ์ ๋ฐํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ๊ฐ ํ์
์, ํนํ ์ปฌ๋ ์
์ด๋ ์ง์ญ ๋ณ์๋ก ์ฌ์ฉ๋ ๋, ํ ์๋ฐ์ ํฌ๊ฒ ์ค์ฌ์ค๋๋ค. ์ด๋ C#(
struct์ฌ์ฉ) ๋ฐ Java(Java์ ์์ ํ์ ์ ๋ณธ์ง์ ์ผ๋ก ๊ฐ ํ์ ์ด๋ฉฐ, ํ๋ก์ ํธ ๋ฐํ ๋ผ๋ ๋ ์ผ๋ฐ์ ์ธ ๊ฐ ํ์ ์ ๋์ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํจ)์ ๊ฐ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ธ์ด์์ ํนํ ์ ์ฉํฉ๋๋ค. - ์บ์ ์ง์ญ์ฑ ํฅ์: ๊ฐ ํ์ ์ ๋ฐฐ์ด์ด๋ ์ปฌ๋ ์ ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ์ ์ฅ๋ ๋, ์์๋ฅผ ์์ฐจ์ ์ผ๋ก ์ ๊ทผํ๋ฉด ๋ฐ์ด๋ ์บ์ ์ง์ญ์ฑ์ ์ป์ ์ ์์ต๋๋ค. CPU๋ ๋ฐ์ดํฐ๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ํ๋ฆฌํ์นํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ํ๋์จ์ด ์ํคํ ์ฒ์์ ๊ณผํ ์๋ฎฌ๋ ์ด์ ๋ถํฐ ๊ฒ์ ๊ฐ๋ฐ์ ์ด๋ฅด๊ธฐ๊น์ง ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ํ ์์์ ๋๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ ์ค๋ฒํค๋ ์์: ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ธ์ด์ ๊ฒฝ์ฐ, ๊ฐ ํ์ ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์์ ๋ถํ๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ๊ฐ ํ์ ์ ์ข ์ข ์ค์ฝํ๋ฅผ ๋ฒ์ด๋ ๋(์คํ ํ ๋น) ๋๋ ํฌํจํ๋ ๊ฐ์ฒด๊ฐ ์์ง๋ ๋(์ธ๋ผ์ธ ์ ์ฅ) ์๋์ผ๋ก ํ ๋น ํด์ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ธ๋ก๋ฒ ์์: C#์์ ์ํ ์ฐ์ฐ์ ์ํ Vector3 ๊ตฌ์กฐ์ฒด๋ ๊ทธ๋ํฝ ์ขํ๋ฅผ ์ํ Point ๊ตฌ์กฐ์ฒด๋ ์คํ ํ ๋น ๋ฐ ์บ์ ์ด์ ์ผ๋ก ์ธํด ์ฑ๋ฅ์ด ์ค์ํ ๋ฃจํ์์ ํด๋์ค ๋์๋ฌผ๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, Rust์์๋ ๋ชจ๋ ํ์
์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ํ์
์ด๋ฉฐ, ๊ฐ๋ฐ์๋ค์ ํ ํ ๋น์ด ํ์ํ ๋ ๋ช
์์ ์ผ๋ก ์ฐธ์กฐ ํ์
(Box, Arc, Rc)์ ์ฌ์ฉํ๋ฏ๋ก ๊ฐ ์๋งจํฑ์ ๋๋ฌ์ผ ์ฑ๋ฅ ๊ณ ๋ ค๋ ์ธ์ด ์ค๊ณ์ ๋ด์ฌ๋์ด ์์ต๋๋ค.
์ ๋ค๋ฆญ ๋ฐ ํ ํ๋ฆฟ ์ต์ ํ
์ ๋ค๋ฆญ(Java, C#, Go)๊ณผ ํ ํ๋ฆฟ(C++)์ ํ์ ์์ ์ฑ์ ํฌ์ํ์ง ์์ผ๋ฉด์ ํ์ ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ์ธ์ด ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ๋จํ์ฑ(Monomorphization) vs. ๋คํ์ฑ(Polymorphism): C++ ํ ํ๋ฆฟ์ ์ผ๋ฐ์ ์ผ๋ก ๋จํํ๋ฉ๋๋ค. ์ฆ, ์ปดํ์ผ๋ฌ๋ ํ ํ๋ฆฟ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฐ๊ฐ์ ๊ณ ์ ํ ํ์ ์ ๋ํด ๋ณ๋์ ํนํ๋ ๋ฒ์ ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๊ณ ๋๋ก ์ต์ ํ๋ ์ง์ ํธ์ถ๋ก ์ด์ด์ ธ ๋ฐํ์ ๋์คํจ์น ์ค๋ฒํค๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค. Rust์ ์ ๋ค๋ฆญ๋ ์ฃผ๋ก ๋จํํ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊ณต์ ์ฝ๋ ์ ๋ค๋ฆญ: Java์ C# ๊ฐ์ ์ธ์ด๋ ์ข
์ข
๋ชจ๋ ์ฐธ์กฐ ํ์
์ ์ฒ๋ฆฌํ๋ ๋จ์ผ ์ปดํ์ผ๋ ์ ๋ค๋ฆญ ๊ตฌํ์ ์ฌ์ฉํ๋ "๊ณต์ ์ฝ๋" ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค(Java์์๋ ํ์
์๊ฑฐ ํ ๋๋ C#์์๋ ํน์ ์ ์ฝ ์กฐ๊ฑด ์์ด ๊ฐ ํ์
์ ๋ํด ๋ด๋ถ์ ์ผ๋ก
object๋ฅผ ์ฌ์ฉํ์ฌ). ์ด๋ ์ฝ๋ ํฌ๊ธฐ๋ฅผ ์ค์ด์ง๋ง, ๊ฐ ํ์ ์ ๋ํ ๋ฐ์ฑ/์ธ๋ฐ์ฑ ๋ฐ ๋ฐํ์ ํ์ ๊ฒ์ฌ์ ๋ํ ์ฝ๊ฐ์ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ C#์struct์ ๋ค๋ฆญ์ ์ข ์ข ํนํ๋ ์ฝ๋ ์์ฑ์ ์ด์ ์ ๋๋ฆฝ๋๋ค. - ํน์ํ ๋ฐ ์ ์ฝ ์กฐ๊ฑด: ์ ๋ค๋ฆญ์์ ํ์
์ ์ฝ ์กฐ๊ฑด(์: C#์
where T : struct)์ ํ์ฉํ๊ฑฐ๋ C++์์ ํ ํ๋ฆฟ ๋ฉํํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ค๋ฆญ ํ์ ์ ๋ํด ๋ ๊ฐ๋ ฅํ ๊ฐ์ ์ ํ์ฌ ๋ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ํ์ ์ ๋ํ ๋ช ์์ ํน์ํ๋ ์ฑ๋ฅ์ ๋์ฑ ์ต์ ํํ ์ ์์ต๋๋ค.
์ค์ฉ์ ํต์ฐฐ: ์ ํํ ์ธ์ด๊ฐ ์ ๋ค๋ฆญ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ์ดํดํ์ธ์. ์ฑ๋ฅ์ด ์ค์ํ ๋๋ ๋จํํ๋ ์ ๋ค๋ฆญ์ ์ ํธํ๊ณ , ๊ณต์ ์ฝ๋ ์ ๋ค๋ฆญ ๊ตฌํ์์๋ ํนํ ๊ฐ ํ์ ์ปฌ๋ ์ ์ ๋ค๋ฃฐ ๋ ๋ฐ์ฑ ์ค๋ฒํค๋๋ฅผ ์ธ์งํด์ผ ํฉ๋๋ค.
๋ถ๋ณ ํ์ ์ ํจ๊ณผ์ ์ธ ์ฌ์ฉ
๋ถ๋ณ ํ์ ์ ์์ฑ๋ ํ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ฒด์ ๋๋ค. ์ฒ์์๋ ์ฑ๋ฅ์ ์ง๊ด์ ์ด์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง(์์ ์ ์๋ก์ด ๊ฐ์ฒด ์์ฑ์ด ํ์ํ๋ฏ๋ก), ๋ถ๋ณ์ฑ์ ํนํ ๋์์ฑ ๋ฐ ๋ถ์ฐ ์์คํ ์์ ์ฌ์คํ ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํ๋ฉฐ, ์ด๋ ๊ธ๋ก๋ฒํ๋ ์ปดํจํ ํ๊ฒฝ์์ ์ ์ ๋ ๋ณดํธํ๋๊ณ ์์ต๋๋ค.
- ๋ฝ ์๋ ์ค๋ ๋ ์์ ์ฑ: ๋ถ๋ณ ๊ฐ์ฒด๋ ๋ณธ์ง์ ์ผ๋ก ์ค๋ ๋์ ์์ ํฉ๋๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ฝ์ด๋ ๋๊ธฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ ์์ด ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ๋์์ ์ฝ์ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์์ ์ ๋ช ๋์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์๊ณผ ๋ณต์ก์ฑ์ ์์ธ์ ๋๋ค. ์ด๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ๋จ์ํํ์ฌ ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์์์ ๋ ์ฝ๊ฒ ํ์ฅํ ์ ์๊ฒ ํฉ๋๋ค.
- ์์ ํ ๊ณต์ ๋ฐ ์บ์ฑ: ๋ถ๋ณ ๊ฐ์ฒด๋ ์๊ธฐ์น ์์ ๋ถ์์ฉ์ ๋ํ ๋๋ ค์ ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ ๋คํธ์ํฌ ๊ฒฝ๊ณ๋ฅผ ๋์ด(์ง๋ ฌํ๋ฅผ ํตํด) ์์ ํ๊ฒ ๊ณต์ ๋ ์ ์์ต๋๋ค. ์ํ๊ฐ ์ ๋ ๋ณํ์ง ์์ผ๋ฏ๋ก ์บ์ฑ์ ํ๋ฅญํ ํ๋ณด์ ๋๋ค.
- ์์ธก ๊ฐ๋ฅ์ฑ ๋ฐ ๋๋ฒ๊น : ๋ถ๋ณ ๊ฐ์ฒด์ ์์ธก ๊ฐ๋ฅํ ํน์ฑ์ ๊ณต์ ๋ ๊ฐ๋ณ ์ํ์ ๊ด๋ จ๋ ๋ฒ๊ทธ๋ฅผ ์ค์ฌ ๋ ๊ฒฌ๊ณ ํ ์์คํ ์ ๋ง๋ญ๋๋ค.
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์์ ์ฑ๋ฅ: ๊ฐ๋ ฅํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๊ฐ์ง ์ธ์ด๋ค(์: Haskell, F#, Scala, ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์ ์ ๋ ๋ง์ด ์ฌ์ฉ๋๋ JavaScript ๋ฐ Python)์ ๋ถ๋ณ์ฑ์ ๋ง์ด ํ์ฉํฉ๋๋ค. "์์ "์ ์ํด ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ์ปดํ์ผ๋ฌ์ ๋ฐํ์์ ์ข ์ข ์ด๋ฌํ ์์ ์ ์ต์ ํํ์ฌ(์: ์๊ตฌ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ตฌ์กฐ์ ๊ณต์ ) ์ค๋ฒํค๋๋ฅผ ์ต์ํํฉ๋๋ค.
๊ธ๋ก๋ฒ ์์: ๊ตฌ์ฑ ์ค์ , ๊ธ์ต ๊ฑฐ๋ ๋๋ ์ฌ์ฉ์ ํ๋กํ์ ๋ถ๋ณ ๊ฐ์ฒด๋ก ํํํ๋ฉด ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ๋ง์ดํฌ๋ก์๋น์ค ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ๋์์ฑ์ ๋จ์ํํฉ๋๋ค. Java์ ๊ฐ์ ์ธ์ด๋ ๋ถ๋ณ์ฑ์ ์ฅ๋ คํ๊ธฐ ์ํด final ํ๋์ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, Guava์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ถ๋ณ ์ปฌ๋ ์
์ ์ ๊ณตํฉ๋๋ค. JavaScript์์๋ Object.freeze()์ Immer ๋๋ Immutable.js์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ถ๋ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
ํ์ ์๊ฑฐ ๋ฐ ์ธํฐํ์ด์ค ๋์คํจ์น ์ต์ ํ
์ข ์ข Java์ ์ ๋ค๋ฆญ๊ณผ ์ฐ๊ด๋๋ ํ์ ์๊ฑฐ, ๋๋ ๋ ๋๊ฒ๋ ๋คํ์ ๋์์ ๋ฌ์ฑํ๊ธฐ ์ํ ์ธํฐํ์ด์ค/ํธ๋ ์ดํธ์ ์ฌ์ฉ์ ๋์ ๋์คํจ์น๋ก ์ธํด ์ฑ๋ฅ ๋น์ฉ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ธํฐํ์ด์ค ์ฐธ์กฐ์์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋, ๋ฐํ์์ ๊ฐ์ฒด์ ์ค์ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ๊ฒฐ์ ํ ๋ค์ ์ฌ๋ฐ๋ฅธ ๋ฉ์๋ ๊ตฌํ์ ํธ์ถํด์ผ ํฉ๋๋ค. ์ด๋ vtable ์กฐํ ๋๋ ์ ์ฌํ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
- ๊ฐ์ ํธ์ถ ์ต์ํ: C++ ๋๋ C#๊ณผ ๊ฐ์ ์ธ์ด์์ ์ฑ๋ฅ์ด ์ค์ํ ๋ฃจํ์ ๊ฐ์ ๋ฉ์๋ ํธ์ถ ์๋ฅผ ์ค์ด๋ฉด ์๋นํ ์ด๋์ ์ป์ ์ ์์ต๋๋ค. ๋๋ก๋ ํ ํ๋ฆฟ(C++)์ด๋ ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ตฌ์กฐ์ฒด(C#)๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฒ์์๋ ๋คํ์ฑ์ด ํ์ํด ๋ณด์๋ ๊ณณ์์ ์ ์ ๋์คํจ์น๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค.
- ํนํ๋ ๊ตฌํ: ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค์ ๊ฒฝ์ฐ, ํน์ ํ์ ์ ๋ํด ๊ณ ๋๋ก ์ต์ ํ๋ ๋น๋คํ์ ๊ตฌํ์ ์ ๊ณตํ๋ฉด ๊ฐ์ ๋์คํจ์น ๋น์ฉ์ ์ฐํํ ์ ์์ต๋๋ค.
- ํธ๋ ์ดํธ ๊ฐ์ฒด (Rust): Rust์ ํธ๋ ์ดํธ ๊ฐ์ฒด(
Box<dyn MyTrait>)๋ ๊ฐ์ ํจ์์ ์ ์ฌํ ๋์ ๋์คํจ์น๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ Rust๋ ์ ์ ๋์คํจ์น๊ฐ ์ ํธ๋๋ "์ ๋ก ์ฝ์คํธ ์ถ์ํ"๋ฅผ ์ฅ๋ คํฉ๋๋ค.Box<dyn MyTrait>๋์ ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์T: MyTrait๋ฅผ ๋ฐ์์ผ๋ก์จ, ์ปดํ์ผ๋ฌ๋ ์ข ์ข ์ฝ๋๋ฅผ ๋จํํํ์ฌ ์ ์ ๋์คํจ์น์ ์ธ๋ผ์ด๋๊ณผ ๊ฐ์ ๊ด๋ฒ์ํ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค. - Go ์ธํฐํ์ด์ค: Go์ ์ธํฐํ์ด์ค๋ ๋์ ์ด์ง๋ง ๋ ๊ฐ๋จํ ๊ธฐ๋ณธ ํํ(ํ์ ํฌ์ธํฐ์ ๋ฐ์ดํฐ ํฌ์ธํฐ๋ฅผ ํฌํจํ๋ 2์๋ ๊ตฌ์กฐ์ฒด)์ ๊ฐ์ง๋๋ค. ์ฌ์ ํ ๋์ ๋์คํจ์น๋ฅผ ํฌํจํ์ง๋ง, ๊ฒฝ๋ ํน์ฑ๊ณผ ์ธ์ด์ ๊ตฌ์ฑ ์ค์ฌ ์ ๊ทผ ๋ฐฉ์ ๋๋ถ์ ์๋นํ ์ฑ๋ฅ์ด ์ข์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํซ ๊ฒฝ๋ก์์ ๋ถํ์ํ ์ธํฐํ์ด์ค ๋ณํ์ ํผํ๋ ๊ฒ์ ์ฌ์ ํ ์ข์ ๊ดํ์ ๋๋ค.
์ค์ฉ์ ํต์ฐฐ: ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ์ฌ ํซ์คํ์ ์๋ณํ์ธ์. ๋์ ๋์คํจ์น๊ฐ ๋ณ๋ชฉ ํ์์ธ ๊ฒฝ์ฐ, ํด๋น ํน์ ์๋๋ฆฌ์ค์ ๋ํด ์ ๋ค๋ฆญ, ํ ํ๋ฆฟ ๋๋ ํนํ๋ ๊ตฌํ์ ํตํด ์ ์ ๋์คํจ์น๋ฅผ ๋ฌ์ฑํ ์ ์๋์ง ์กฐ์ฌํ์ญ์์ค.
ํฌ์ธํฐ/์ฐธ์กฐ ์ต์ ํ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์
๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์น๋๋ ๋ฐฉ์๊ณผ ํฌ์ธํฐ/์ฐธ์กฐ๊ฐ ๊ด๋ฆฌ๋๋ ๋ฐฉ์์ ์บ์ ์ฑ๋ฅ๊ณผ ์ ๋ฐ์ ์ธ ์๋์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด๋ ํนํ ์์คํ ํ๋ก๊ทธ๋๋ฐ ๋ฐ ๋ฐ์ดํฐ ์ง์ฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ด๋ จ์ด ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์งํฅ ์ค๊ณ (DOD): ๊ฐ์ฒด๊ฐ ๋ฐ์ดํฐ์ ๋์์ ์บก์ํํ๋ ๊ฐ์ฒด ์งํฅ ์ค๊ณ(OOD) ๋์ , DOD๋ ์ต์ ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. ์ด๋ ์ข ์ข ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ๋ฐฐ์ดํ๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ(์: ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ ๋ฐฐ์ด ๋์ ๊ตฌ์กฐ์ฒด ๋ฐฐ์ด), ์ด๋ ์บ์ ํํธ์จ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ์ด ์์น์ ์ ์ธ๊ณ์ ์ผ๋ก ๊ณ ์ฑ๋ฅ ์ปดํจํ , ๊ฒ์ ์์ง, ๊ธ์ต ๋ชจ๋ธ๋ง์์ ๋ง์ด ์ ์ฉ๋ฉ๋๋ค.
- ํจ๋ฉ ๋ฐ ์ ๋ ฌ: CPU๋ ๋ฐ์ดํฐ๊ฐ ํน์ ๋ฉ๋ชจ๋ฆฌ ๊ฒฝ๊ณ์ ์ ๋ ฌ๋ ๋ ์ข
์ข
๋ ๋์ ์ฑ๋ฅ์ ๋ณด์
๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฅผ ์ฒ๋ฆฌํ์ง๋ง, ๋ช
์์ ์ธ ์ ์ด(์: C/C++์
__attribute__((aligned)), Rust์#[repr(align(N))])๋ ํนํ ํ๋์จ์ด๋ ๋คํธ์ํฌ ํ๋กํ ์ฝ๊ณผ ์ํธ ์์ฉํ ๋ ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ์ ๋ ์ด์์์ ์ต์ ํํ๊ธฐ ์ํด ๋๋๋ก ํ์ํ ์ ์์ต๋๋ค. - ๊ฐ์ ์ฐธ์กฐ ์ค์ด๊ธฐ: ๋ชจ๋ ํฌ์ธํฐ ์ญ์ฐธ์กฐ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๋ฏธ ์บ์์ ์๋ ๊ฒฝ์ฐ ์บ์ ๋ฏธ์ค๋ฅผ ์ ๋ฐํ ์ ์๋ ๊ฐ์ ์ฐธ์กฐ์ ๋๋ค. ํนํ ํ์ดํธํ ๋ฃจํ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ ์ฅํ๊ฑฐ๋ ์ปดํฉํธํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ต์ํํ๋ฉด ์๋นํ ์๋ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น: ๋น๋ฒํ ์์ ์ ๊ทผ๊ณผ ์บ์ ์ง์ญ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ, C++์์๋
std::list๋ณด๋คstd::vector๋ฅผ, Java์์๋LinkedList๋ณด๋คArrayList๋ฅผ ์ ํธํ์ญ์์ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ ์์๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์ฅํ์ฌ ๋ ๋์ ์บ์ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ์์: ๋ฌผ๋ฆฌ ์์ง์์ ๋ชจ๋ ์
์์ ์์น๋ฅผ ํ ๋ฐฐ์ด์, ์๋๋ฅผ ๋ค๋ฅธ ๋ฐฐ์ด์, ๊ฐ์๋๋ฅผ ์ธ ๋ฒ์งธ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒ("๋ฐฐ์ด์ ๊ตฌ์กฐ์ฒด" ๋๋ SoA)์ Particle ๊ฐ์ฒด์ ๋ฐฐ์ด("๊ตฌ์กฐ์ฒด์ ๋ฐฐ์ด" ๋๋ AoS)๋ณด๋ค ์ข
์ข
๋ ๋์ ์ฑ๋ฅ์ ๋ณด์
๋๋ค. ์๋ํ๋ฉด CPU๊ฐ ๋์ข
๋ฐ์ดํฐ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ํน์ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐ๋ณตํ ๋ ์บ์ ๋ฏธ์ค๋ฅผ ์ค์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
์ปดํ์ผ๋ฌ ๋ฐ ๋ฐํ์ ์ง์ ์ต์ ํ
๋ช ์์ ์ธ ์ฝ๋ ๋ณ๊ฒฝ ์ธ์๋, ํ๋ ์ปดํ์ผ๋ฌ์ ๋ฐํ์์ ํ์ ์ฌ์ฉ์ ์๋์ผ๋ก ์ต์ ํํ๋ ์ ๊ตํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
Just-In-Time (JIT) ์ปดํ์ผ ๋ฐ ํ์ ํผ๋๋ฐฑ
JIT ์ปดํ์ผ๋ฌ(Java, C#, JavaScript V8, PyPy๋ฅผ ์ฌ์ฉํ๋ Python์์ ์ฌ์ฉ)๋ ๊ฐ๋ ฅํ ์ฑ๋ฅ ์์ง์ ๋๋ค. ์ด๋ค์ ๋ฐ์ดํธ์ฝ๋๋ ์ค๊ฐ ํํ์ ๋ฐํ์์ ๋ค์ดํฐ๋ธ ๊ธฐ๊ณ ์ฝ๋๋ก ์ปดํ์ผํฉ๋๋ค. ๊ฒฐ์ ์ ์ผ๋ก, JIT๋ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ์์ง๋ "ํ์ ํผ๋๋ฐฑ"์ ํ์ฉํ ์ ์์ต๋๋ค.
- ๋์ ์ญ์ต์ ํ ๋ฐ ์ฌ์ต์ ํ: JIT๋ ์ฒ์์ ๋คํ์ ํธ์ถ ์ฌ์ดํธ์์ ๋ง์ฃผ์น๋ ํ์ ์ ๋ํด ๋๊ด์ ์ธ ๊ฐ์ ์ ํ ์ ์์ต๋๋ค(์: ํน์ ๊ตฌ์ฒด์ ์ธ ํ์ ์ด ํญ์ ์ ๋ฌ๋๋ค๊ณ ๊ฐ์ ). ์ด ๊ฐ์ ์ด ์ค๋ซ๋์ ์ ์ง๋๋ฉด ๊ณ ๋๋ก ์ต์ ํ๋ ํนํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋์ค์ ๊ฐ์ ์ด ๊ฑฐ์ง์ผ๋ก ํ๋ช ๋๋ฉด, JIT๋ ๋ ์ต์ ํ๋ ๊ฒฝ๋ก๋ก "์ญ์ต์ ํ"ํ ๋ค์ ์๋ก์ด ํ์ ์ ๋ณด๋ก "์ฌ์ต์ ํ"ํ ์ ์์ต๋๋ค.
- ์ธ๋ผ์ธ ์บ์ฑ: JIT๋ ์ธ๋ผ์ธ ์บ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ํธ์ถ์ ์์ ์ ํ์ ์ ๊ธฐ์ตํ์ฌ ๋์ผํ ํ์ ์ ๋ํ ํ์ ํธ์ถ ์๋๋ฅผ ๋์ ๋๋ค.
- ํ์ถ ๋ถ์: Java์ C#์์ ์ผ๋ฐ์ ์ธ ์ด ์ต์ ํ๋ ๊ฐ์ฒด๊ฐ ๋ก์ปฌ ์ค์ฝํ๋ฅผ "ํ์ถ"ํ๋์ง(์ฆ, ๋ค๋ฅธ ์ค๋ ๋์ ๋ณด์ด๊ฒ ๋๊ฑฐ๋ ํ๋์ ์ ์ฅ๋๋์ง) ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ํ์ถํ์ง ์์ผ๋ฉด ํ ๋์ ์คํ์ ํ ๋น๋ ์ ์์ด GC ์๋ฐ์ ์ค์ด๊ณ ์ง์ญ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์ด ๋ถ์์ ์ปดํ์ผ๋ฌ์ ๊ฐ์ฒด ํ์ ๋ฐ ์๋ช ์ฃผ๊ธฐ์ ๋ํ ์ดํด์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
์ค์ฉ์ ํต์ฐฐ: JIT๋ ๋๋ํ์ง๋ง, ๋ ๋ช
ํํ ํ์
์ ํธ๋ฅผ ์ ๊ณตํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด(์: C#์์ ๊ณผ๋ํ object ์ฌ์ฉ์ด๋ Java/Kotlin์์ Any ์ฌ์ฉ์ ํผํจ) JIT๊ฐ ๋ ์ต์ ํ๋ ์ฝ๋๋ฅผ ๋ ๋นจ๋ฆฌ ์์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
ํ์ ํน์ํ๋ฅผ ์ํ Ahead-Of-Time (AOT) ์ปดํ์ผ
AOT ์ปดํ์ผ์ ์คํ ์ ์, ์ข ์ข ๊ฐ๋ฐ ์์ ์ ์ฝ๋๋ฅผ ๋ค์ดํฐ๋ธ ๊ธฐ๊ณ ์ฝ๋๋ก ์ปดํ์ผํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. JIT์ ๋ฌ๋ฆฌ AOT ์ปดํ์ผ๋ฌ๋ ๋ฐํ์ ํ์ ํผ๋๋ฐฑ์ด ์์ง๋ง, ๋ฐํ์ ์ ์ฝ์ผ๋ก ์ธํด JIT๊ฐ ํ ์ ์๋ ๊ด๋ฒ์ํ๊ณ ์๊ฐ ์๋ชจ์ ์ธ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- ๊ณต๊ฒฉ์ ์ธ ์ธ๋ผ์ด๋ ๋ฐ ๋จํํ: AOT ์ปดํ์ผ๋ฌ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑธ์ณ ํจ์๋ฅผ ์์ ํ ์ธ๋ผ์ธํ๊ณ ์ ๋ค๋ฆญ ์ฝ๋๋ฅผ ๋จํํํ์ฌ ๋ ์๊ณ ๋น ๋ฅธ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ C++, Rust, Go ์ปดํ์ผ์ ํน์ง์ ๋๋ค.
- ๋งํฌ ํ์ ์ต์ ํ (LTO): LTO๋ ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ ๋จ์ ์ ๋ฐ์ ๊ฑธ์ณ ์ต์ ํ๋ฅผ ์ํํ๋๋ก ํ์ฌ ํ๋ก๊ทธ๋จ์ ์ ์ญ์ ์ธ ๋ทฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ ๊ณต๊ฒฉ์ ์ธ ๋ฐ๋ ์ฝ๋ ์ ๊ฑฐ, ํจ์ ์ธ๋ผ์ด๋, ๋ฐ์ดํฐ ๋ ์ด์์ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ์ด ๋ชจ๋ ๊ฒ์ ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค์์ ํ์ ์ด ์ฌ์ฉ๋๋ ๋ฐฉ์์ ์ํฅ์ ๋ฐ์ต๋๋ค.
- ์์ ์๊ฐ ๋จ์ถ: ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์๋ฒ๋ฆฌ์ค ํจ์์ ๊ฒฝ์ฐ, AOT ์ปดํ์ผ๋ ์ธ์ด๋ JIT ์๋ฐ์ ๋จ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ข ์ข ๋ ๋น ๋ฅธ ์์ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํญ๋ฐ์ ์ธ ์ํฌ๋ก๋์ ๋ํ ์ด์ ๋น์ฉ์ ์ค์ผ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ปจํ ์คํธ: ์๋ฒ ๋๋ ์์คํ , ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ (iOS, Android ๋ค์ดํฐ๋ธ), ๊ทธ๋ฆฌ๊ณ ์์ ์๊ฐ์ด๋ ๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ๊ฐ ์ค์ํ ํด๋ผ์ฐ๋ ํจ์์ ๊ฒฝ์ฐ, AOT ์ปดํ์ผ(์: C++, Rust, Go ๋๋ Java์ฉ GraalVM ๋ค์ดํฐ๋ธ ์ด๋ฏธ์ง)์ ์ปดํ์ผ ์์ ์ ์๋ ค์ง ๊ตฌ์ฒด์ ์ธ ํ์ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ํน์ํํ์ฌ ์ข ์ข ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
ํ๋กํ ๊ธฐ๋ฐ ์ต์ ํ (PGO)
PGO๋ AOT์ JIT ์ฌ์ด์ ๊ฐ๊ทน์ ๋ฉ์๋๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปดํ์ผํ๊ณ , ๋ํ์ ์ธ ์ํฌ๋ก๋๋ก ์คํํ์ฌ ํ๋กํ์ผ๋ง ๋ฐ์ดํฐ(์: ํซ ์ฝ๋ ๊ฒฝ๋ก, ์์ฃผ ์ฌ์ฉ๋๋ ๋ถ๊ธฐ, ์ค์ ํ์ ์ฌ์ฉ ๋น๋)๋ฅผ ์์งํ ๋ค์, ์ด ํ๋กํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ปดํ์ผํ์ฌ ๋งค์ฐ ์ ๋ณด์ ์ ๊ฐํ ์ต์ ํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ์ค์ ํ์ ์ฌ์ฉ: PGO๋ ์ปดํ์ผ๋ฌ์๊ฒ ๋คํ์ ํธ์ถ ์ฌ์ดํธ์์ ์ด๋ค ํ์ ์ด ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋์ง์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ, ํด๋น ์ผ๋ฐ์ ์ธ ํ์ ์ ๋ํ ์ต์ ํ๋ ์ฝ๋ ๊ฒฝ๋ก์ ๋๋ฌธ ํ์ ์ ๋ํ ๋ ์ต์ ํ๋ ๊ฒฝ๋ก๋ฅผ ์์ฑํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋ถ๊ธฐ ์์ธก ๋ฐ ๋ฐ์ดํฐ ๋ ์ด์์ ๊ฐ์ : ํ๋กํ ๋ฐ์ดํฐ๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์ดํ์ฌ ์บ์ ๋ฏธ์ค์ ๋ถ๊ธฐ ์์ธก ์คํจ๋ฅผ ์ต์ํํ๋๋ก ์๋ดํ๋ฉฐ, ์ด๋ ์ฑ๋ฅ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ค์ฉ์ ํต์ฐฐ: PGO๋ C++, Rust, Go์ ๊ฐ์ ์ธ์ด์ ํ๋ก๋์ ๋น๋์์ ์๋นํ ์ฑ๋ฅ ํฅ์(์ข ์ข 5-15%)์ ์ ๊ณตํ ์ ์์ผ๋ฉฐ, ํนํ ๋ณต์กํ ๋ฐํ์ ๋์์ด๋ ๋ค์ํ ํ์ ์ํธ ์์ฉ์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํฉ๋๋ค. ์ด๋ ์ข ์ข ๊ฐ๊ณผ๋๋ ๊ณ ๊ธ ์ต์ ํ ๊ธฐ๋ฒ์ ๋๋ค.
์ธ์ด๋ณ ์ฌ์ธต ๋ถ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
๊ณ ๊ธ ํ์ ์ต์ ํ ๊ธฐ๋ฒ์ ์ ์ฉ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฐ๋ผ ํฌ๊ฒ ๋ค๋ฆ ๋๋ค. ์ฌ๊ธฐ์๋ ์ธ์ด๋ณ ์ ๋ต์ ์ฌ์ธต์ ์ผ๋ก ์ดํด๋ด ๋๋ค.
C++: constexpr, ํ ํ๋ฆฟ, ์ด๋ ์๋งจํฑ, ์์ ๊ฐ์ฒด ์ต์ ํ
constexpr: ์ ๋ ฅ์ด ์๋ ค์ง ๊ฒฝ์ฐ ์ปดํ์ผ ์๊ฐ์ ๊ณ์ฐ์ ์ํํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ๋ณต์กํ ํ์ ๊ด๋ จ ๊ณ์ฐ์ด๋ ์์ ๋ฐ์ดํฐ ์์ฑ์ ๋ํ ๋ฐํ์ ์ค๋ฒํค๋๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.- ํ ํ๋ฆฟ ๋ฐ ๋ฉํํ๋ก๊ทธ๋๋ฐ: C++ ํ ํ๋ฆฟ์ ์ ์ ๋คํ์ฑ(๋จํํ)๊ณผ ์ปดํ์ผ ์๊ฐ ๊ณ์ฐ์ ๋งค์ฐ ๊ฐ๋ ฅํฉ๋๋ค. ํ ํ๋ฆฟ ๋ฉํํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํ๋ฉด ๋ณต์กํ ํ์ ์์กด์ ๋ก์ง์ ๋ฐํ์์์ ์ปดํ์ผ ์๊ฐ์ผ๋ก ์ฎ๊ธธ ์ ์์ต๋๋ค.
- ์ด๋ ์๋งจํฑ (C++11+):
rvalue์ฐธ์กฐ์ ์ด๋ ์์ฑ์/ํ ๋น ์ฐ์ฐ์๋ฅผ ๋์ ํฉ๋๋ค. ๋ณต์กํ ํ์ ์ ๊ฒฝ์ฐ, ๋ฆฌ์์ค(์: ๋ฉ๋ชจ๋ฆฌ, ํ์ผ ํธ๋ค)๋ฅผ ๊น์ ๋ณต์ฌํ๋ ๋์ "์ด๋"ํ๋ฉด ๋ถํ์ํ ํ ๋น ๋ฐ ํ ๋น ํด์ ๋ฅผ ํผํ์ฌ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. - ์์ ๊ฐ์ฒด ์ต์ ํ (SOO): ์์ ํ์
(์:
std::string,std::vector)์ ๊ฒฝ์ฐ, ์ผ๋ถ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ์ SOO๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ ์๋์ ๋ฐ์ดํฐ๋ ๊ฐ์ฒด ์์ฒด ๋ด์ ์ง์ ์ ์ฅ๋์ด ์ผ๋ฐ์ ์ธ ์์ ๊ฒฝ์ฐ์ ๋ํ ํ ํ ๋น์ ํผํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์์ ์ ์ปค์คํ ํ์ ์ ๋ํด ์ ์ฌํ ์ต์ ํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. - ๋ฐฐ์น new(Placement New): ๋ฏธ๋ฆฌ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒด ์์ฑ์ ํ์ฉํ๋ ๊ณ ๊ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ผ๋ก, ๋ฉ๋ชจ๋ฆฌ ํ ๋ฐ ๊ณ ์ฑ๋ฅ ์๋๋ฆฌ์ค์ ์ ์ฉํฉ๋๋ค.
Java/C#: ์์ ํ์ , ๊ตฌ์กฐ์ฒด(C#), Final/Sealed, ํ์ถ ๋ถ์
- ์์ ํ์
์ฐ์ ์ฌ์ฉ: ์ฑ๋ฅ์ด ์ค์ํ ์น์
์์๋ ๋ฐ์ฑ/์ธ๋ฐ์ฑ ์ค๋ฒํค๋์ ํ ํ ๋น์ ํผํ๊ธฐ ์ํด ํญ์ ๋ํผ ํด๋์ค(
Integer,Float,Double,Boolean) ๋์ ์์ ํ์ (int,float,double,bool)์ ์ฌ์ฉํ์ญ์์ค. - C#
structs: ์๊ณ ๊ฐ๊ณผ ๊ฐ์ ๋ฐ์ดํฐ ํ์ (์: ํฌ์ธํธ, ์์, ์์ ๋ฒกํฐ)์ ๋ํดstruct๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ํ ๋น๊ณผ ํฅ์๋ ์บ์ ์ง์ญ์ฑ์ ์ด์ ์ ๋๋ฆฌ์ญ์์ค. ํนํ ๋ฉ์๋ ์ธ์๋ก ์ ๋ฌํ ๋ ๊ฐ์ ์ํ ๋ณต์ฌ ์๋งจํฑ์ ์ ์ํ์ญ์์ค. ๋ ํฐ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ๋ฌํ ๋ ์ฑ๋ฅ์ ์ํดref๋๋inํค์๋๋ฅผ ์ฌ์ฉํ์ญ์์ค. final(Java) /sealed(C#): ํด๋์ค๋ฅผfinal๋๋sealed๋ก ํ์ํ๋ฉด JIT ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ์๋๊ฐ ์ฌ์ ์๋ ์ ์๋ค๋ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ์๋ ํธ์ถ ์ธ๋ผ์ด๋๊ณผ ๊ฐ์ ๋ ๊ณต๊ฒฉ์ ์ธ ์ต์ ํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค.- ํ์ถ ๋ถ์ (JVM/CLR): JVM๊ณผ CLR์ด ์ํํ๋ ์ ๊ตํ ํ์ถ ๋ถ์์ ์์กดํ์ญ์์ค. ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ์ ์ดํ์ง๋ ์์ง๋ง, ๊ทธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด ๊ฐ์ฒด๊ฐ ์ ํ๋ ๋ฒ์๋ฅผ ๊ฐ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋์ด ์คํ ํ ๋น์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
record struct(C# 9+): ๊ฐ ํ์ ์ ์ด์ ๊ณผ ๋ ์ฝ๋์ ๊ฐ๊ฒฐํจ์ ๊ฒฐํฉํ์ฌ, ์ข์ ์ฑ๋ฅ ํน์ฑ์ ๊ฐ์ง ๋ถ๋ณ ๊ฐ ํ์ ์ ๋ ์ฝ๊ฒ ์ ์ํ ์ ์๊ฒ ํฉ๋๋ค.
Rust: ์ ๋ก ์ฝ์คํธ ์ถ์ํ, ์์ ๊ถ, ๋น๋ฆผ, Box, Arc, Rc
- ์ ๋ก ์ฝ์คํธ ์ถ์ํ: Rust์ ํต์ฌ ์ฒ ํ์
๋๋ค. ์ดํฐ๋ ์ดํฐ๋
Result/Optionํ์ ๊ณผ ๊ฐ์ ์ถ์ํ๋ ์ง์ ์์ฑํ C ์ฝ๋๋งํผ ๋น ๋ฅด๊ฑฐ๋ ๋ ๋น ๋ฅธ ์ฝ๋๋ก ์ปดํ์ผ๋๋ฉฐ, ์ถ์ํ ์์ฒด์ ๋ํ ๋ฐํ์ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค. ์ด๋ ๊ฐ๋ ฅํ ํ์ ์์คํ ๊ณผ ์ปดํ์ผ๋ฌ์ ํฌ๊ฒ ์์กดํฉ๋๋ค. - ์์ ๊ถ๊ณผ ๋น๋ฆผ: ์ปดํ์ผ ์๊ฐ์ ๊ฐ์ ๋๋ ์์ ๊ถ ์์คํ ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์์ด๋ ๋งค์ฐ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ฉด์ ์ ์ฒด ๋ฐํ์ ์ค๋ฅ ํด๋์ค(๋ฐ์ดํฐ ๊ฒฝ์, ํด์ ํ ์ฌ์ฉ)๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์ด ์ปดํ์ผ ์๊ฐ ๋ณด์ฅ์ ๋๋ ค์ ์๋ ๋์์ฑ๊ณผ ์์ธก ๊ฐ๋ฅํ ์ฑ๋ฅ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ค๋งํธ ํฌ์ธํฐ (
Box,Arc,Rc):Box<T>: ๋จ์ผ ์์ ์, ํ ํ ๋น ์ค๋งํธ ํฌ์ธํฐ. ๋จ์ผ ์์ ์๋ฅผ ์ํด ํ ํ ๋น์ด ํ์ํ ๋ ์ฌ์ฉํฉ๋๋ค(์: ์ฌ๊ท์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋๋ ๋งค์ฐ ํฐ ์ง์ญ ๋ณ์).Rc<T>(์ฐธ์กฐ ์นด์ดํธ): ๋จ์ผ ์ค๋ ๋ ์ปจํ ์คํธ์์ ๋ค์ค ์์ ์๋ฅผ ์ํด ์ฌ์ฉํฉ๋๋ค. ์์ ๊ถ์ ๊ณต์ ํ๋ฉฐ, ๋ง์ง๋ง ์์ ์๊ฐ ๋๋กญ๋ ๋ ์ ๋ฆฌ๋ฉ๋๋ค.Arc<T>(์์์ ์ฐธ์กฐ ์นด์ดํธ): ๋ค์ค ์ค๋ ๋ ์ปจํ ์คํธ๋ฅผ ์ํ ์ค๋ ๋ ์์ Rc์ด์ง๋ง, ์์์ ์ฐ์ฐ์ผ๋ก ์ธํดRc์ ๋นํด ์ฝ๊ฐ์ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํฉ๋๋ค.
#[inline]/#[no_mangle]/#[repr(C)]: ํน์ ์ต์ ํ ์ ๋ต(์ธ๋ผ์ด๋, ์ธ๋ถ ABI ํธํ์ฑ, ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์)์ ์ํด ์ปดํ์ผ๋ฌ๋ฅผ ์๋ดํ๋ ์์ฑ์ ๋๋ค.
Python/JavaScript: ํ์ ํํธ, JIT ๊ณ ๋ ค์ฌํญ, ์ ์คํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ํ
๋์ ํ์ ์ธ์ด์ด์ง๋ง, ์ด ์ธ์ด๋ค์ ์ ์คํ ํ์ ๊ณ ๋ ค๋ก๋ถํฐ ์๋นํ ์ด์ ์ ์ป์ต๋๋ค.
- ํ์ ํํธ (Python): ์ ํ ์ฌํญ์ด๋ฉฐ ์ฃผ๋ก ์ ์ ๋ถ์๊ณผ ๊ฐ๋ฐ์ ๋ช ํ์ฑ์ ์ํ ๊ฒ์ด์ง๋ง, ํ์ ํํธ๋ ๋๋๋ก ๊ณ ๊ธ JIT(์: PyPy)๊ฐ ๋ ๋์ ์ต์ ํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค. ๋ ์ค์ํ ๊ฒ์, ๊ธ๋ก๋ฒ ํ์ ์ํด ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํจ๋ค๋ ๊ฒ์ ๋๋ค.
- JIT ์ธ์: Python(์: CPython)์ ์ธํฐํ๋ฆฌํฐ ์ธ์ด์ธ ๋ฐ๋ฉด, JavaScript๋ ์ข ์ข ๊ณ ๋๋ก ์ต์ ํ๋ JIT ์์ง(V8, SpiderMonkey)์์ ์คํ๋๋ค๋ ๊ฒ์ ์ดํดํ์ญ์์ค. JavaScript์์ JIT๋ฅผ ํผ๋์ค๋ฝ๊ฒ ํ๋ "์ญ์ต์ ํ" ํจํด, ์๋ฅผ ๋ค์ด ๋ณ์์ ํ์ ์ ์์ฃผ ๋ณ๊ฒฝํ๊ฑฐ๋ ํซ ์ฝ๋์์ ๊ฐ์ฒด์ ๋์ ์ผ๋ก ์์ฑ์ ์ถ๊ฐ/์ ๊ฑฐํ๋ ๊ฒ์ ํผํ์ญ์์ค.
- ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ํ: ๋ ์ธ์ด ๋ชจ๋์์ ๋ด์ฅ ๋ฐ์ดํฐ ๊ตฌ์กฐ(Python์
listvs.tuplevs.setvs.dict; JavaScript์Arrayvs.Objectvs.Mapvs.Set)์ ์ ํ์ด ์ค์ํฉ๋๋ค. ๊ธฐ๋ณธ ๊ตฌํ๊ณผ ์ฑ๋ฅ ํน์ฑ(์: ํด์ ํ ์ด๋ธ ์กฐํ vs. ๋ฐฐ์ด ์ธ๋ฑ์ฑ)์ ์ดํดํ์ญ์์ค. - ๋ค์ดํฐ๋ธ ๋ชจ๋/WebAssembly: ์ ๋ง๋ก ์ฑ๋ฅ์ด ์ค์ํ ์น์ ์ ๊ฒฝ์ฐ, ๊ณ์ฐ์ ๋ค์ดํฐ๋ธ ๋ชจ๋(Python C ํ์ฅ, Node.js N-API)์ด๋ WebAssembly(๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ JavaScript์ฉ)๋ก ์คํ๋ก๋ํ์ฌ ์ ์ ํ์ , AOT ์ปดํ์ผ ์ธ์ด๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
Go: ์ธํฐํ์ด์ค ๋ง์กฑ, ๊ตฌ์กฐ์ฒด ์๋ฒ ๋ฉ, ๋ถํ์ํ ํ ๋น ํผํ๊ธฐ
- ๋ช ์์ ์ธํฐํ์ด์ค ๋ง์กฑ: Go์ ์ธํฐํ์ด์ค๋ ์์์ ์ผ๋ก ๋ง์กฑ๋๋ฉฐ, ์ด๋ ๊ฐ๋ ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ธํฐํ์ด์ค๊ฐ ์๊ฒฉํ๊ฒ ํ์ํ์ง ์์ ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ์ง์ ์ ๋ฌํ๋ฉด ์ธํฐํ์ด์ค ๋ณํ ๋ฐ ๋์ ๋์คํจ์น์ ์์ ์ค๋ฒํค๋๋ฅผ ํผํ ์ ์์ต๋๋ค.
- ๊ตฌ์กฐ์ฒด ์๋ฒ ๋ฉ: Go๋ ์์๋ณด๋ค ๊ตฌ์ฑ์ ์ฅ๋ คํฉ๋๋ค. ๊ตฌ์กฐ์ฒด ์๋ฒ ๋ฉ(๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ๋ด์ ๊ตฌ์กฐ์ฒด๋ฅผ ํฌํจ)์ ์ข ์ข ๊น์ ์์ ๊ณ์ธต๋ณด๋ค ์ฑ๋ฅ์ด ์ข์ "has-a" ๊ด๊ณ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๊ฐ์ ๋ฉ์๋ ํธ์ถ ๋น์ฉ์ ํผํฉ๋๋ค.
- ํ ํ ๋น ์ต์ํ: Go์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ง๋ง, ๋ถํ์ํ ํ ํ ๋น์ ์ฌ์ ํ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํฉ๋๋ค. ์ ์ ํ ๊ฒฝ์ฐ ๊ฐ ํ์
(๊ตฌ์กฐ์ฒด)์ ์ ํธํ๊ณ , ๋ฒํผ๋ฅผ ์ฌ์ฌ์ฉํ๋ฉฐ, ๋ฃจํ ๋ด์ ๋ฌธ์์ด ์ฐ๊ฒฐ์ ์ ์ํ์ญ์์ค.
make์newํจ์๋ ์ฉ๋๊ฐ ๋ค๋ฅด๋ฏ๋ก ๊ฐ๊ฐ ์ธ์ ์ ์ ํ์ง ์ดํดํด์ผ ํฉ๋๋ค. - ํฌ์ธํฐ ์๋งจํฑ: Go๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ธ์ด์ด์ง๋ง, ๊ตฌ์กฐ์ฒด์ ๋ํด ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ์ง ๊ฐ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ ์ง๋ฅผ ์ดํดํ๋ ๊ฒ์ ํนํ ํฐ ๊ตฌ์กฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ ๋ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
ํ์ ๊ธฐ๋ฐ ์ฑ๋ฅ์ ์ํ ๋๊ตฌ ๋ฐ ๋ฐฉ๋ฒ๋ก
ํจ๊ณผ์ ์ธ ํ์ ์ต์ ํ๋ ๋จ์ง ๊ธฐ์ ์ ์๋ ๊ฒ๋ฟ๋ง ์๋๋ผ, ์ฒด๊ณ์ ์ผ๋ก ์ ์ฉํ๊ณ ๊ทธ ์ํฅ์ ์ธก์ ํ๋ ๊ฒ์ ๋๋ค.
ํ๋กํ์ผ๋ง ๋๊ตฌ (CPU, ๋ฉ๋ชจ๋ฆฌ, ํ ๋น ํ๋กํ์ผ๋ฌ)
์ธก์ ํ์ง ์๋ ๊ฒ์ ์ต์ ํํ ์ ์์ต๋๋ค. ํ๋กํ์ผ๋ฌ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
- CPU ํ๋กํ์ผ๋ฌ: (์: Linux์
perf, Visual Studio ํ๋กํ์ผ๋ฌ, Java Flight Recorder, Go pprof, JavaScript์ฉ Chrome DevTools)๋ ๊ฐ์ฅ ๋ง์ CPU ์๊ฐ์ ์๋นํ๋ "ํซ์คํ"(ํจ์ ๋๋ ์ฝ๋ ์น์ )์ ์ ํํ ์ฐพ์๋ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ค์ ๋คํ์ ํธ์ถ์ด ์์ฃผ ๋ฐ์ํ๋ ๊ณณ, ๋ฐ์ฑ/์ธ๋ฐ์ฑ ์ค๋ฒํค๋๊ฐ ๋์ ๊ณณ, ๋๋ ์๋ชป๋ ๋ฐ์ดํฐ ๋ ์ด์์์ผ๋ก ์ธํด ์บ์ ๋ฏธ์ค๊ฐ ๋ง์ฐํ ๊ณณ์ ๋๋ฌ๋ผ ์ ์์ต๋๋ค. - ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ฌ: (์: Valgrind Massif, Java VisualVM, .NET์ฉ dotMemory, Chrome DevTools์ ํ ์ค๋ ์ท)๋ ๊ณผ๋ํ ํ ํ ๋น, ๋ฉ๋ชจ๋ฆฌ ๋์, ๊ฐ์ฒด ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ดํดํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ์๋ฐ๊ณผ ๊ฐ ํ์ vs. ์ฐธ์กฐ ํ์ ์ ์ํฅ๊ณผ ์ง์ ์ ์ผ๋ก ๊ด๋ จ์ด ์์ต๋๋ค.
- ํ ๋น ํ๋กํ์ผ๋ฌ: ํ ๋น ์ฌ์ดํธ์ ์ด์ ์ ๋ง์ถ ํนํ๋ ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ฌ๋ ๊ฐ์ฒด๊ฐ ํ์ ์ด๋์ ํ ๋น๋๋์ง๋ฅผ ์ ํํ ๋ณด์ฌ์ฃผ์ด, ๊ฐ ํ์ ์ด๋ ๊ฐ์ฒด ํ๋ง์ ํตํด ํ ๋น์ ์ค์ด๋ ค๋ ๋ ธ๋ ฅ์ ์๋ดํฉ๋๋ค.
๊ธ๋ก๋ฒ ๊ฐ์ฉ์ฑ: ์ด๋ฌํ ๋๊ตฌ ์ค ๋ค์๋ ์คํ ์์ค์ด๊ฑฐ๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ IDE์ ๋ด์ฅ๋์ด ์์ด ์ง๋ฆฌ์ ์์น๋ ์์ฐ์ ๊ด๊ณ์์ด ๊ฐ๋ฐ์๊ฐ ์ ๊ทผํ ์ ์์ต๋๋ค. ๊ทธ๋ค์ ์ถ๋ ฅ์ ํด์ํ๋ ๋ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์ ํต์ฌ ๊ธฐ์ ์ ๋๋ค.
๋ฒค์น๋งํน ํ๋ ์์ํฌ
์ ์ฌ์ ์ธ ์ต์ ํ๊ฐ ํ์ธ๋๋ฉด, ๊ทธ ์ํฅ์ ์ ๋ขฐ์ฑ ์๊ฒ ์ ๋ํํ๊ธฐ ์ํด ๋ฒค์น๋งํฌ๊ฐ ํ์ํฉ๋๋ค.
- ๋ง์ดํฌ๋ก ๋ฒค์น๋งํน: (์: Java์ฉ JMH, C++์ฉ Google Benchmark, C#์ฉ Benchmark.NET, Go์
testingํจํค์ง)์ ์์ ์ฝ๋ ๋จ์๋ฅผ ๊ฒฉ๋ฆฌํ์ฌ ์ ๋ฐํ๊ฒ ์ธก์ ํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ๋ค๋ฅธ ํ์ ๊ด๋ จ ๊ตฌํ(์: struct vs. class, ๋ค๋ฅธ ์ ๋ค๋ฆญ ์ ๊ทผ ๋ฐฉ์)์ ์ฑ๋ฅ์ ๋น๊ตํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. - ๋งคํฌ๋ก ๋ฒค์น๋งํน: ๋ ํฐ ์์คํ ๊ตฌ์ฑ ์์๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋จ ๊ฐ ์ฑ๋ฅ์ ํ์ค์ ์ธ ๋ถํ ํ์์ ์ธก์ ํฉ๋๋ค.
์ค์ฉ์ ํต์ฐฐ: ์ต์ ํ๋ฅผ ์ ์ฉํ๊ธฐ ์ ๊ณผ ํ์ ํญ์ ๋ฒค์น๋งํฌ๋ฅผ ์ํํ์ญ์์ค. ์ ์ฒด ์์คํ ์ ๋ฏธ์น๋ ์ํฅ์ ๋ช ํํ ์ดํดํ์ง ๋ชปํ ์ฑ ๋ง์ดํฌ๋ก ์ต์ ํ๋ฅผ ๊ฒฝ๊ณํ์ญ์์ค. ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ํ์ ์ํด ์ฌํ ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ธฐ ์ํด ๋ฒค์น๋งํฌ๊ฐ ์์ ์ ์ด๊ณ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์์ ์คํ๋๋๋ก ํ์ญ์์ค.
์ ์ ๋ถ์ ๋ฐ ๋ฆฐํฐ
์ ์ ๋ถ์ ๋๊ตฌ(์: Clang-Tidy, SonarQube, ESLint, Pylint, GoVet)๋ ๋ฐํ์ ์ด์ ์๋ ํ์ ์ฌ์ฉ๊ณผ ๊ด๋ จ๋ ์ ์ฌ์ ์ธ ์ฑ๋ฅ ํจ์ ์ ์๋ณํ ์ ์์ต๋๋ค.
- ๋นํจ์จ์ ์ธ ์ปฌ๋ ์ ์ฌ์ฉ, ๋ถํ์ํ ๊ฐ์ฒด ํ ๋น, ๋๋ JIT ์ปดํ์ผ ์ธ์ด์์ ์ญ์ต์ ํ๋ฅผ ์ด๋ํ ์ ์๋ ํจํด์ ํ๋๊ทธํ ์ ์์ต๋๋ค.
- ๋ฆฐํฐ๋ ์ฑ๋ฅ ์นํ์ ์ธ ํ์
์ฌ์ฉ์ ์ฅ๋ คํ๋ ์ฝ๋ฉ ํ์ค์ ๊ฐ์ ํ ์ ์์ต๋๋ค(์: ๊ตฌ์ฒด์ ์ธ ํ์
์ด ์๋ ค์ง ๊ฒฝ์ฐ C#์์
var object์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์).
์ฑ๋ฅ์ ์ํ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ (TDD)
๊ฐ๋ฐ ์ํฌํ๋ก์ฐ์ ์ฒ์๋ถํฐ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ์ ํตํฉํ๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ดํ์ ๋๋ค. ์ด๋ ์ ํ์ฑ์ ์ํ ํ ์คํธ๋ฟ๋ง ์๋๋ผ ์ฑ๋ฅ์ ์ํ ํ ์คํธ๋ ์์ฑํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ์ฑ๋ฅ ์์ฐ: ์ค์ํ ํจ์๋ ๊ตฌ์ฑ ์์์ ๋ํ ์ฑ๋ฅ ์์ฐ์ ์ ์ํ์ญ์์ค. ์๋ํ๋ ๋ฒค์น๋งํฌ๋ ์ฑ๋ฅ์ด ํ์ฉ ๊ฐ๋ฅํ ์๊ณ๊ฐ์ ์ด๊ณผํ์ฌ ์ ํ๋ ๊ฒฝ์ฐ ์คํจํ๋ ํ๊ท ํ ์คํธ ์ญํ ์ ํ ์ ์์ต๋๋ค.
- ์กฐ๊ธฐ ๋ฐ๊ฒฌ: ์ค๊ณ ๋จ๊ณ ์ด๊ธฐ์ ํ์ ๊ณผ ๊ทธ ์ฑ๋ฅ ํน์ฑ์ ์ง์คํ๊ณ ์ฑ๋ฅ ํ ์คํธ๋ก ๊ฒ์ฆํจ์ผ๋ก์จ, ๊ฐ๋ฐ์๋ ์๋นํ ๋ณ๋ชฉ ํ์์ด ๋์ ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ ๋ฐ ๋ฏธ๋ ๋ํฅ
๊ณ ๊ธ ํ์ ์ต์ ํ๋ ๋จ์ํ ํ๋ฌธ์ ์ฐ์ต์ด ์๋๋ผ, ์ค์ง์ ์ธ ๊ธ๋ก๋ฒ ์ํฅ์ ๋ฏธ์น๋ฉฐ ๋ฏธ๋ ํ์ ์ ์ํ ์ค์ํ ์์ญ์ ๋๋ค.
ํด๋ผ์ฐ๋ ์ปดํจํ ๋ฐ ์ฃ์ง ๋๋ฐ์ด์ค์์์ ์ฑ๋ฅ
ํด๋ผ์ฐ๋ ํ๊ฒฝ์์๋ ๋งค ๋ฐ๋ฆฌ์ด ์ ์ฝ์ด ์ด์ ๋น์ฉ ์ ๊ฐ๊ณผ ํ์ฅ์ฑ ํฅ์์ผ๋ก ์ง์ ์ด์ด์ง๋๋ค. ํจ์จ์ ์ธ ํ์ ์ฌ์ฉ์ CPU ์ฌ์ดํด, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๋คํธ์ํฌ ๋์ญํญ์ ์ต์ํํ๋ฉฐ, ์ด๋ ๋น์ฉ ํจ์จ์ ์ธ ๊ธ๋ก๋ฒ ๋ฐฐํฌ์ ์ค์ํฉ๋๋ค. ๋ฆฌ์์ค๊ฐ ์ ํ๋ ์ฃ์ง ๋๋ฐ์ด์ค(IoT, ๋ชจ๋ฐ์ผ, ์๋ฒ ๋๋ ์์คํ )์ ๊ฒฝ์ฐ, ํจ์จ์ ์ธ ํ์ ์ต์ ํ๋ ์ข ์ข ์์ฉ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ์ํ ์ ์ ์กฐ๊ฑด์ ๋๋ค.
๊ทธ๋ฆฐ ์ํํธ์จ์ด ์์ง๋์ด๋ง ๋ฐ ์๋์ง ํจ์จ์ฑ
๋์งํธ ํ์ ๋ฐ์๊ตญ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์๋์ง ํจ์จ์ฑ์ ์ํด ์ํํธ์จ์ด๋ฅผ ์ต์ ํํ๋ ๊ฒ์ด ๊ธ๋ก๋ฒ ๊ณผ์ ๊ฐ ๋๊ณ ์์ต๋๋ค. ๋ ์ ์ CPU ์ฌ์ดํด, ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ, ๋ ์ ์ I/O ์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ์ฝ๋๋ ์ง์ ์ ์ผ๋ก ๋ฎ์ ์๋์ง ์๋น์ ๊ธฐ์ฌํฉ๋๋ค. ๊ณ ๊ธ ํ์ ์ต์ ํ๋ "๊ทธ๋ฆฐ ์ฝ๋ฉ" ๊ดํ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์์ ๋๋ค.
์ ํฅ ์ธ์ด ๋ฐ ํ์ ์์คํ
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ๊ฒฝ์ ๊ณ์ํด์ ์งํํ๊ณ ์์ต๋๋ค. ์๋ก์ด ์ธ์ด(์: Zig, Nim)์ ๊ธฐ์กด ์ธ์ด์ ๋ฐ์ (์: C++ ๋ชจ๋, Java ํ๋ก์ ํธ ๋ฐํ ๋ผ, C# ref ํ๋)์ ํ์
๊ธฐ๋ฐ ์ฑ๋ฅ์ ์ํ ์๋ก์ด ํจ๋ฌ๋ค์๊ณผ ๋๊ตฌ๋ฅผ ๋์์์ด ๋์
ํฉ๋๋ค. ์ด๋ฌํ ๋ฐ์ ์ ๋ํ ์ต์ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๊ฒ์ ๊ฐ์ฅ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ถํ๋ ค๋ ๊ฐ๋ฐ์์๊ฒ ์ค์ํ ๊ฒ์
๋๋ค.
๊ฒฐ๋ก : ํ์ ์ ๋ง์คํฐํ๊ณ , ์ฑ๋ฅ์ ๋ง์คํฐํ๋ผ
๊ณ ๊ธ ํ์ ์ต์ ํ๋ ๊ณ ์ฑ๋ฅ, ๋ฆฌ์์ค ํจ์จ์ , ๊ทธ๋ฆฌ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ๊ฒฝ์๋ ฅ ์๋ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ์ ๋ ํ๋ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ์ ๊ตํ๋ฉด์๋ ํ์์ ์ธ ์์ญ์ ๋๋ค. ์ด๋ ๋จ์ํ ๊ตฌ๋ฌธ์ ๋์ด, ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ ๋ด์์ ๋ฐ์ดํฐ ํํ๊ณผ ์กฐ์์ ์๋ฏธ๋ก ์์ฒด๋ฅผ ํ๊ตฌํฉ๋๋ค. ๊ฐ ํ์ ์ ์ ์คํ ์ ํ๋ถํฐ ์ปดํ์ผ๋ฌ ์ต์ ํ์ ๋ํ ๋ฏธ๋ฌํ ์ดํด, ๊ทธ๋ฆฌ๊ณ ์ธ์ด๋ณ ๊ธฐ๋ฅ์ ์ ๋ต์ ์ ์ฉ์ ์ด๋ฅด๊ธฐ๊น์ง, ํ์ ์์คํ ์ ๋ํ ๊น์ ์ฐธ์ฌ๋ ๋จ์ง ์๋ํ๋ ์ฝ๋๊ฐ ์๋๋ผ ํ์ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ ํ์ ์ค๋๋ค.
์ด๋ฌํ ๊ธฐ์ ์ ์์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋น ๋ฅด๊ฒ ์คํ๋๊ณ , ๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ์๋นํ๋ฉฐ, ๊ฐ์ฅ ์์ ์๋ฒ ๋๋ ์ฅ์น์์ ๊ฐ์ฅ ํฐ ํด๋ผ์ฐ๋ ์ธํ๋ผ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ํ๋์จ์ด ๋ฐ ์ด์ ํ๊ฒฝ์์ ๋ ํจ๊ณผ์ ์ผ๋ก ํ์ฅ๋ ์ ์์ต๋๋ค. ์ธ๊ณ๊ฐ ๋์ฑ ๋ฐ์์ด ๋น ๋ฅด๊ณ ์ง์ ๊ฐ๋ฅํ ์ํํธ์จ์ด๋ฅผ ์๊ตฌํจ์ ๋ฐ๋ผ, ๊ณ ๊ธ ํ์ ์ต์ ํ๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ๋ ์ด์ ์ ํ์ ๊ธฐ์ ์ด ์๋๋ผ ์์ง๋์ด๋ง ์ฐ์์ฑ์ ์ํ ๊ธฐ๋ณธ ์๊ตฌ ์ฌํญ์ ๋๋ค. ์ค๋๋ถํฐ ํ๋กํ์ผ๋ง, ์คํ, ๊ทธ๋ฆฌ๊ณ ํ์ ์ฌ์ฉ์ ๊ฐ์ ํ๊ธฐ ์์ํ์ญ์์ค. ๋น์ ์ ์ ํ๋ฆฌ์ผ์ด์ , ์ฌ์ฉ์, ๊ทธ๋ฆฌ๊ณ ์ง๊ตฌ๊ฐ ๊ฐ์ฌํ ๊ฒ์ ๋๋ค.